home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 8 / Night Owl CD-ROM (NOPV8) (Night Owl Publisher) (1993).ISO / 047a / lex_yacc.arj / FINDPROC.L < prev    next >
Text File  |  1989-05-28  |  3KB  |  104 lines

  1.  
  2. %{
  3. (* Sample Lex program to search for function and procedure headers in
  4.    Pascal source files. *)
  5.  
  6. (* Name: findproc - search procedures and functions in Pascal source files
  7.    Synopsis: findproc <file-name-spec> [><output-file>]
  8.    Description: looks for lines starting with a procedure or function header
  9.      in the specified files (wildcards allowed; extension .pas must be given
  10.      explicitly); prints numbers and contents of the lines found; output may
  11.      also be redirected to <output-file>
  12.    Bugs: "function" and "procedure" keywords must either be in lower- or
  13.      uppercase (no mixed upper/lowercase); cannot handle nested comments
  14.      in Turbo Pascal style
  15. *)
  16.  
  17. (* to compile this Lex program, issue the command `lex findproc' and then
  18.    `tpc findproc' *)
  19.  
  20. uses LexLib, DOS;
  21. function yywrap : boolean; forward;
  22.   (* redefined for wrap around at endoffile *)
  23. procedure scan_comment; forward;
  24.   (* skips a comment *)
  25. %}
  26.  
  27. function        function|FUNCTION
  28. procedure        procedure|PROCEDURE
  29.  
  30. %%
  31.  
  32. ^[ \t]*({function}|{procedure})[ \t].*$
  33.                 begin
  34.                   writeln(yylineno:4, ': ', yytext);
  35.                   reject
  36.                     { reject is needed to reprocess
  37.                       any comments on the line }
  38.                 end;
  39.  
  40. "(*"                |
  41. "{"                scan_comment;
  42. .                |
  43. \n                ;
  44.  
  45. %%
  46.  
  47. var
  48.   search_rec : SearchRec; (* used to process wildcards *)
  49.  
  50. function path(filename : string) : string;
  51.   (* returns path contained in filename *)
  52.   var
  53.     i : integer;
  54.   begin
  55.     for i := length(filename) downto 1 do
  56.       if (filename[i]=':') or (filename[i]='\') then
  57.         begin
  58.           path := copy(filename, 1, i);
  59.           exit
  60.         end;
  61.     path := ''
  62.   end(*path*);
  63. procedure openfile(name : string);
  64.   begin
  65.     writeln(name, ':');
  66.     assign(yyin, name);
  67.     reset(yyin);
  68.     yylineno := 1;
  69.   end(*openfile*);
  70. function yywrap;
  71.   begin
  72.     close(yyin);
  73.     findNext(search_rec);
  74.     if DosError=0 then openfile(path(paramStr(1))+search_rec.name);
  75.     yywrap := DosError<>0
  76.   end(*yywrap*);
  77. procedure scan_comment;
  78.   var c : char;
  79.   begin
  80.     repeat
  81.       case input of
  82.         '*': begin
  83.                c := input;
  84.                if c=')' then
  85.                  exit
  86.                else
  87.                  unput(c)
  88.              end;
  89.         '}': exit;
  90.       end
  91.     until false
  92.   end(*scan_comment*);
  93.  
  94. begin
  95.   findFirst(paramStr(1), 0, search_rec);
  96.   if DosError=0 then
  97.     begin
  98.       openfile(path(paramStr(1))+search_rec.name);
  99.       if yylex=0 then (* done *)
  100.     end
  101.   else
  102.     writeln('no files found')
  103. end(*findproc*).
  104.